From 8fb98708308bec25d9e80c7ebe0360cb95fc11f9 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Sat, 12 Mar 2011 13:19:02 +0000 Subject: [PATCH] x86/HPET: fix initialization order At least the legacy path can enter its interrupt handler callout while initialization is still in progress - that handler checks whether ->event_handler is non-NULL, and hence all other initialization must happen before setting this field. Do the same to the MSI initialization just in case (and to keep the code in sync). Signed-off-by: Jan Beulich --- xen/arch/x86/hpet.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/hpet.c b/xen/arch/x86/hpet.c index af568a3708..6fc7a35586 100644 --- a/xen/arch/x86/hpet.c +++ b/xen/arch/x86/hpet.c @@ -597,9 +597,10 @@ void hpet_broadcast_init(void) 1000000000ul, 32); hpet_events[i].shift = 32; hpet_events[i].next_event = STIME_MAX; - hpet_events[i].event_handler = handle_hpet_broadcast; spin_lock_init(&hpet_events[i].lock); rwlock_init(&hpet_events[i].cpumask_lock); + wmb(); + hpet_events[i].event_handler = handle_hpet_broadcast; } return; @@ -630,11 +631,12 @@ void hpet_broadcast_init(void) legacy_hpet_event.mult = div_sc((unsigned long)hpet_rate, 1000000000ul, 32); legacy_hpet_event.shift = 32; legacy_hpet_event.next_event = STIME_MAX; - legacy_hpet_event.event_handler = handle_hpet_broadcast; legacy_hpet_event.idx = 0; legacy_hpet_event.flags = 0; spin_lock_init(&legacy_hpet_event.lock); rwlock_init(&legacy_hpet_event.cpumask_lock); + wmb(); + legacy_hpet_event.event_handler = handle_hpet_broadcast; if ( !force_hpet_broadcast ) pv_rtc_handler = handle_rtc_once; -- 2.30.2